home *** CD-ROM | disk | FTP | other *** search
/ Amiga Plus 1995 #5 & #6 / Amiga Plus CD - 1995 - No. 5 and 6.iso / pd / serien / purity / nr.5 / pascal / pcq-programme / game / game.mod < prev    next >
Text File  |  1995-04-19  |  16KB  |  438 lines

  1. External;
  2.  
  3. {   Die hier folgenden Routinen sind alle für die Benutzung
  4.     ind den Spielen gedacht.
  5.     Nähere Informationen: siehe Dokumentation
  6. }
  7.  
  8. CONST
  9.     CopyRight : string = "19. Juni 1992 , Jörg Wach ";
  10.     RevNummer : string = "Version V1.00";
  11.  
  12. { --------------------------------------------------------------------- }
  13. { ---------    GraphCollision  ---------------------------------------- }
  14. { --------------------------------------------------------------------- }
  15.  
  16. {$I "include:Exec/libraries.i"  }
  17. {$I "include:exec/interrupts.i"  }  { für Permit/Forbid }
  18.  
  19. {$I "include:intuition/intuition.i"}
  20.  
  21. {$I "include:graphics/Pens.i"      }
  22. {$I "include:graphics/Text.i"      }
  23. {$I "include:graphics/Graphics.i"  }
  24. {$I "include:graphics/rastport.i"  } { für den Rastport }
  25. {$I "include:graphics/blitter.i"  }  { für die Blitter-Funktionen }
  26.  
  27.  
  28. { - Die verwendeten Typen, Constanten und Variablen. ------------------ }
  29.  
  30.  
  31. TYPE
  32.         ObjektDef = record  { die Definition meiner Spielobjekte }
  33.             Ox      :   short;  { x-Position linke obere Ecke }
  34.             Oy      :   short;  { y-Position linke obere Ecke }
  35.             Sizex   :   short;  { x-size }
  36.             Sizey   :   short;  { y-size }
  37.             Speedx  :   short;  { x-Geschwindigkeit }
  38.             Speedy  :   short;  { y-Geschwindigkeit }
  39.             Phase1  :   short;  { Bewegungsphasenzähler1 }
  40.             Phase2  :   short;  { Bewegungsphasenzähler2 }
  41.             typ     :   short;  { Objekttyp }
  42.         end;
  43.  
  44. CONST
  45.         Objektsize : integer = sizeof(ObjektDef); { Größe eines Objektes }
  46.  
  47. VAR
  48.         Objekt     : array[0..255] of ObjektDef;  { Max. Anzahl der Objekte }
  49.         Picture    : array[1..20] of Image;  { Max. 20 Bilder }
  50.  
  51.         blitctrl        : short;    { Globale Variable für Blitterergebnis }
  52.         BlittiSpeicher  : Address;  { Wird benötigt, weil überschneidungen
  53.                                       bei der Bearbeitung auftreten !!! }
  54.         MyBitMap        : Address;  { Adresse der BitMap }
  55.         MyRPort    : RastPortPtr;
  56. { --------------------------------------------------------------------- }
  57.  
  58.  
  59. Procedure GraphCollision( x1, y1, xsize, ysize : short);
  60. { Testet einen BitMapBereich auf vorhandene Punkte. xsize und ysize
  61.   bestimmen das Ausmaß des zu testenden Bereiches. }
  62. var
  63.     dummy : integer;    { Rückgabewert von BltBitMap. Wird nicht benötigt }
  64. begin
  65.  
  66.     Forbid();   { Taskswitching aus, damit ist der Blitter mein }
  67.     WaitBlit(); { Auf den Blitter warten, falls dieser noch arbeitet }
  68.     dummy := BltBitMap(MyBitMap,x1,y1,MyBitMap,x1,y1,xsize,ysize,$c0,1,BlittiSpeicher);
  69.     WaitBlit(); { Auf den Blitter warten, falls dieser noch arbeitet }
  70. {$A
  71.     btst.b  #5,$dff002          ; Diese Bit wollen wir testen
  72.     beq.s   Collision1          ; Kollision
  73.     move.w  #0,_blitctrl        ; keine Kollision
  74.     bra.s   Collision2          ; 2. BitPlane abfragen
  75. Collision1:
  76.     move.w  #1,_blitctrl        ; Kollision. _blitctrl setzen
  77. Collision2:
  78. }
  79.     if blitctrl = 0 then begin  { keine Kollision in der 1. Plane }
  80.         dummy := BltBitMap(MyBitMap,x1,y1,MyBitMap,x1,y1,xsize,ysize,$c0,2,BlittiSpeicher);
  81.         WaitBlit(); { Auf den Blitter warten, falls dieser noch arbeitet }
  82. {$A
  83.     btst.b  #5,$dff002          ; Diese Bit wollen wir testen
  84.     beq.s   Collision3          ; Kollision
  85.     move.w  #0,_blitctrl        ; keine Kollision
  86.     bra.s   Collision4          ; 3. BitPlane abfragen
  87. Collision3:
  88.     move.w  #1,_blitctrl        ; Kollision
  89. Collision4:
  90. }
  91.         if blitctrl = 0 then begin { Keine Kollision in der 3. Plane }
  92.            dummy := BltBitMap(MyBitMap,x1,y1,MyBitMap,x1,y1,xsize,ysize,$c0,4,BlittiSpeicher);
  93.            WaitBlit(); { Auf den Blitter warten, falls dieser noch arbeitet }
  94. {$A
  95.     btst.b  #5,$dff002          ; Diese Bit wollen wir testen
  96.     beq.s   Collision5          ; Kollision
  97.     move.w  #0,_blitctrl        ; keine Kollision
  98.     bra.s   Collision6          ; Keine weitere BitPlane
  99. Collision5:
  100.     move.w  #1,_blitctrl        ; Kollision
  101. Collision6:
  102.                                 ; Es gab keine Kollision
  103. }
  104.  
  105.         end; { Abfrage 3. Plane }
  106.     end; { Abfrage 2. Plane }
  107.     Permit();   { Andere wollen auch mal arbeiten ! }
  108. end;{GraphCollision}
  109.  
  110. { --------------------------------------------------------------------- }
  111. { ---------    CollObjekt      ---------------------------------------- }
  112. { --------------------------------------------------------------------- }
  113.  
  114.  
  115. Function CollObjekt(von, bis, x1, y1, x2, y2 : short) : short;
  116. { Die Funktion ermittelt, welches Objekt in dem Rechteck x1, y1, x2, y2
  117.   Kollidiert ist. Hierbei kann ein von / bis Bereich für die Objekt-
  118.   untersuchung angegeben werden (0 - 255 ).
  119.   Wird als Von-Wert -1 angegeben, so werden alle Objekte untersucht und
  120.   die erste Objektnummer, die zur Kollision führte, zurück gegeben.
  121.   Ist der Rückgabewert -1, so gab es eine Kolision mit einem nicht
  122.   definierten Objekt bzw. das Objekt wurde nicht gefunden.
  123. }
  124.  
  125. begin
  126.  
  127. {$A
  128.     movem.l d1-d7/a0-a3,-(sp)   ; alle benutzten Register sichern
  129.                             ; Wahnsinn, 11 Stück !!!
  130.                             ; Die Parameter liegen deshalb auch
  131.                             ; an der um +44 Korrigierten SP-Adresse
  132.     lea     _Objekt,a0      ; 1. Adresse der Elemente laden
  133.     move.l  _Objektsize,a1  ; Größe der Objekte laden
  134.  
  135.  
  136.     move.w  56(sp),d1       ; bis (Urspünglich: 12(sp))
  137.  
  138.     move.w  58(sp),d2       ; von (Urspünglich: 14(sp))
  139.  
  140.     cmp.w   #0,d2           ; sollen alle Objekte untersucht werden ?
  141.     beq.s   CollObjekt2A    ; Sonderfall !!! Objekt ist 0
  142.     bmi.s   CollObjekt2     ; Dann müssen alle Objekte bearbeitet werden
  143.     movea.w d2,a3           ; sichern für den Rückgabezähler
  144.     sub.w   d2,d1           ; Anzahl der Objekte - 1 (für dbra)
  145.  
  146. CollObjekt1:
  147.     adda.l  a1,a0           ; Basisadresse + Objektgröße
  148.     subq    #1,d2           ; d2 erniedrigen
  149.     bne.s   CollObjekt1     ; Tatsächliche Adresse noch nicht ermittelt
  150.     bra.s   CollObjekt3     ; Steht jetzt in a0
  151.  
  152. CollObjekt2:
  153.     move.w  #255,d1         ; 256 Objekte sind zu bearbeiten
  154.     move.w  #0,a3           ; 1. zu bearbeitende Objektnummer
  155.     bra.s   CollObjekt3     ; weiter gehts
  156.  
  157. CollObjekt2A:
  158.     move.w  #0,d1           ; 1  Objekt ist zu bearbeiten
  159.     move.w  #0,a3           ; 1. zu bearbeitende Objektnummer
  160.  
  161. CollObjekt3:
  162.                             ; a0 = Startadresse des 1. Objektes
  163.                             ; a1 = Größe des Objektes
  164.                             ; a3 = Nummer des ersten Objektes
  165.                             ; d1 = Anzahl der Objekte -1
  166.  
  167.     move.w  48(sp),d4       ; y2 (Urspünglich: 4(sp))
  168.  
  169.     move.w  50(sp),d5       ; x2 (Urspünglich: 6(sp))
  170.  
  171.     move.w  52(sp),d6       ; y1 (Urspünglich: 8(sp))
  172.  
  173.     move.w  54(sp),d7       ; x1 (Urspünglich: 10(sp))
  174.  
  175.  
  176. CollObjektLoop:
  177.                             ; Ab hier beginnt die Fragerei immer wieder
  178.     move.w  (a0),d2         ; Ox1-Position in D2
  179.     bmi     CollObjektNext  ; zur Beschleunigung der Abfrage, da Objekt
  180.                             ; tot ist.
  181.     move.w  2(a0),d3        ; Oy1-Position in D3
  182.  
  183.  
  184.     cmp.w   d7,d2           ; Ox1 >= Tx1
  185.     bge.s   CollObjekt4     ; Ja
  186.     bra.s   CollObjekt10    ; nein
  187. CollObjekt4:
  188.     cmp.w   d5,d2           ; Ox1 <= Tx2
  189.     bls.s   CollObjekt100   ; Ja
  190.                             ; nein, weiter bei Stufe 10
  191. CollObjekt10:
  192.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  193.     cmp.w   d7,d2           ; Ox2 >= Tx1
  194.     bge.s   CollObjekt11    ; Ja
  195.     bra.s   CollObjekt20    ; nein
  196.  
  197. CollObjekt11:
  198.     cmp.w   d5,d2           ; Ox2 <= Tx2
  199.     bls.s   CollObjekt100   ; Ja
  200.                             ; nein, weiter bei Stufe 20
  201. CollObjekt20:
  202.     move.w  (a0),d2         ; Ox1 wieder auf den alten Wert bringen
  203.     cmp.w   d2,d7           ; Tx1 >= Ox1
  204.     bge.s   CollObjekt21    ; Ja
  205.     bra.s   CollObjekt30    ; nein
  206.  
  207. CollObjekt21:
  208.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  209.     cmp.w   d2,d7           ; Tx1 <= Ox2
  210.     bls.s   CollObjekt100   ; Ja
  211.                             ; nein, weiter bei Stufe 30
  212. CollObjekt30:
  213.     move.w  (a0),d2         ; Ox1 wieder auf den alten Wert bringen
  214.     cmp.w   d2,d5           ; Tx2 >= Ox1
  215.     bge.s   CollObjekt31    ; Ja
  216.     bra     CollObjektNext  ; nein, also kein Treffer
  217.  
  218. CollObjekt31:
  219.     add.w   4(a0),d2        ; Ox1 um den x-size Wert erhöhen, um Ox2 zu bekommen
  220.     cmp.w   d2,d5           ; Tx1 <= Ox2
  221.     bls.s   CollObjekt100   ; Ja
  222.     bra     CollObjektNext  ; nein, also kein Treffer
  223.  
  224. CollObjekt100:
  225.     cmp.w   d6,d3           ; Oy1 >= Ty1
  226.     bge.s   CollObjekt101   ; Ja
  227.     bra.s   CollObjekt110   ; nein
  228. CollObjekt101:
  229.     cmp.w   d4,d3           ; Oy1 <= Ty2
  230.     bls.s   CollObjekt200   ; Ja
  231.                             ; nein, weiter bei Stufe 110
  232. CollObjekt110:
  233.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  234.     cmp.w   d6,d3           ; Oy2 >= Ty1
  235.     bge.s   CollObjekt111   ; Ja
  236.     bra.s   CollObjekt120   ; nein
  237.  
  238. CollObjekt111:
  239.     cmp.w   d4,d3           ; Oy2 <= Ty2
  240.     bls.s   CollObjekt200   ; Ja
  241.                             ; nein, weiter bei Stufe 120
  242. CollObjekt120:
  243.     move.w  2(a0),d3        ; Oy1 wieder auf den alten Wert bringen
  244.     cmp.w   d3,d6           ; Ty1 >= Oy1
  245.     bge.s   CollObjekt121   ; Ja
  246.     bra.s   CollObjekt130   ; nein
  247.  
  248. CollObjekt121:
  249.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  250.     cmp.w   d3,d6           ; Ty1 <= Oy2
  251.     bls.s   CollObjekt200   ; Ja
  252.                             ; nein, weiter bei Stufe 130
  253. CollObjekt130:
  254.     move.w  2(a0),d3        ; Oy1 wieder auf den alten Wert bringen
  255.     cmp.w   d3,d4           ; Ty2 >= Oy1
  256.     bge.s   CollObjekt131   ; Ja
  257.     bra.s   CollObjektNext  ; nein, also kein Treffer
  258.  
  259. CollObjekt131:
  260.     add.w   6(a0),d3        ; Oy1 um den y-size Wert erhöhen, um Oy2 zu bekommen
  261.     cmp.w   d3,d4           ; Tx1 <= Ox2
  262.     bls.s   CollObjekt200   ; Ja
  263.     bra.s   CollObjektNext  ; nein, also kein Treffer
  264.  
  265. CollObjekt200:
  266.                             ; Alle Bedingungen sind erfüllt worden,
  267.                             ; also ein Treffer
  268.     move.w  a3,d0           ; die getroffene Objektnummer in d0
  269.     bra.s   CollObjektEnd   ; und ab dafür
  270.  
  271. CollObjektNext:
  272.                             ; Eine oder mehrere Bedingungen wurden nicht
  273.                             ; erfüllt. Also das nächste Objekt.
  274.     adda.l  a1,a0           ; Nächste Objektadresse
  275.     adda.w  #1,a3           ; Objektnummer um eins erhöhen
  276.     dbra.s  d1,CollObjektLoop   ; und weiter geht's
  277.  
  278.     moveq   #-1,d0          ; wir haben kein passendes Objekt gefunden,
  279.                             ; also Fehler
  280.  
  281. CollObjektEnd:
  282.  
  283.     movem.l (sp)+,d1-d7/a0-a3   ; alle benutzten Register wieder zurück
  284. }
  285. end;
  286.  
  287. { --------------------------------------------------------------------- }
  288. { ---------    DrawObjekt/ UnDrawObjekt    ---------------------------- }
  289. { --------------------------------------------------------------------- }
  290.  
  291.  
  292. Procedure DrawObjekt( VonNr, BisNr : short; MyPlanes, NotMyPlanes : byte );
  293. {   Zeichnet die mit VonNr bis BisNr gekennzeichnete Objekte unter
  294.     Beachtung der vorgegebenen Masken }
  295. var
  296.     tt1 : short;
  297. begin
  298.  
  299.     repeat
  300.         tt1 := Objekt[VonNr].Typ;     { Welches Bild sollen wir zeichnen ? }
  301.         Picture[tt1].PlanePick  := MyPlanes;
  302.         Picture[tt1].PlaneOnOff := NotMyPlanes;
  303.  
  304.         DrawImage(MyRPort,ADR(Picture[tt1]),Objekt[VonNr].Ox,Objekt[VonNr].Oy);
  305.         INC(VonNr);
  306.     until VonNr > BisNr;
  307.  
  308. end; { DrawObjekt }
  309.  
  310. Procedure UnDrawObjekt( VonNr, BisNr : short );
  311. {   Löscht die mit VonNr bis BisNr gekennzeichnete Objekte. }
  312. var
  313.     tt1 : short;
  314. begin
  315.     repeat
  316.         tt1 := Objekt[VonNr].Typ;     { Welches Bild sollen wir zeichnen ? }
  317.         Picture[tt1].PlanePick  := 0;
  318.         Picture[tt1].PlaneOnOff := 0;
  319.  
  320.         DrawImage(MyRPort,ADR(Picture[tt1]),Objekt[VonNr].Ox,Objekt[VonNr].Oy);
  321.         INC(VonNr);
  322.     until VonNr > BisNr;
  323. end; { UnDrawObjekt }
  324.  
  325. { --------------------------------------------------------------------- }
  326. { ---------    GetChar                     ---------------------------- }
  327. { --------------------------------------------------------------------- }
  328.  
  329. Function GetChar() : byte;
  330. { Liefert den RAW-Wert einer Taste zurück.
  331.   Ein paar Tastencodes:     AMIGA-links   : $33
  332.                             AMIGA-rechts  : $31
  333.                             DEL           : $73
  334.                             Cursor hoch   : 103
  335.                             Cursor runter : 101
  336.                             Cursor rechts :  99
  337.                             Cursor links  :  97
  338. }
  339. begin
  340. {$A
  341.     move.b  $bfec01,d0  ; Tastaturcode in D0
  342. }
  343. end; {GetChar}
  344.  
  345. { --------------------------------------------------------------------- }
  346. { ---------    GetJoy2                     ---------------------------- }
  347. { --------------------------------------------------------------------- }
  348.  
  349. Function GetJoy2(): byte;
  350. { Gibt folgende Werte zurück:
  351.     0 - Joystick wurde nicht berührt
  352.     1 - Joystick nach rechts
  353.     2 - Joystick nach links
  354.     4 - Joystick nach hinten
  355.     8 - Joystick nach vorne
  356.    16 - Feuertaste gedrückt
  357. }
  358. begin
  359. {$A
  360.     movem.l d1-d2,-(sp)     ; Register sichern
  361.     moveq   #0,d0           ; sauber machen
  362.     moveq   #0,d1           ; sauber machen
  363.     move.w  $DFF00C,d1      ; JOY1DAT holen
  364.     btst.l  #1,d1           ; rechts ?
  365.     beq.s   GetJoy201       ; nein
  366.     bset.l  #0,d0           ; D0 setzen
  367. GetJoy201:
  368.     btst.l  #9,d1           ; links ?
  369.     beq.s   GetJoy202       ; nein
  370.     bset.l  #1,d0           ; D0 setzen
  371. GetJoy202:
  372.     move.w  d1,d2
  373.     lsr.w   #1,d2
  374.     eor.w   d1,d2
  375.     btst    #0,d2           ; hinten ?
  376.     beq.s   GetJoy203       ; nein
  377.     bset.l  #2,d0           ; D0 setzen
  378. GetJoy203:
  379.     btst    #8,d2           ; vorne ?
  380.     beq.s   GetJoy204       ; nein
  381.     bset.l  #3,d0           ; D0 setzen
  382. GetJoy204:
  383.     move.b  $BFE001,d1      ; CIA-A, Paralellport a
  384.     btst.l  #7,d1           ; Feuer ?
  385.     bne.s   GetJoy205       ; nein
  386.     bset.l  #4,d0           ; D0 setzen
  387. GetJoy205:
  388.     movem.l (sp)+,d1-d2     ; Register zurück
  389.  
  390. }
  391. end; { GetJoy2 }
  392.  
  393.  
  394. { --------------------------------------------------------------------- }
  395. { --------- ChipCopy                       ---------------------------- }
  396. { --------------------------------------------------------------------- }
  397.  
  398. Function ChipCopy( Source : Address; Size : integer) : Address;
  399. { Allokiert ChipMem in der Größe Size und kopiert die Daten von
  400.   der Addresse Source dort hinein. Zurückgegeben wird die ChipMem
  401.   Adresse.
  402. }
  403.  
  404. begin
  405. {$A
  406.         XREF    _GfxBase
  407.         XREF    _LVOAllocRaster
  408.  
  409.         movem.l d1-d7/a0-a6,-(sp)   ; register sichern
  410.  
  411.         moveq   #8,d0           ; 1 Byte mal
  412.         move.l  60(sp),d1       ; Size; ursprünglich: 4(sp)
  413.         move.l  _GfxBase,a6
  414.         jsr     _LVOAllocRaster(a6) ; anfordern
  415.                                     ; d0 enthält jetzt die Adresse
  416.  
  417.         tst.l   d0              ; d0 testen
  418.         bne.s   ChipCopy1       ; ist nicht Null, also alles O.K.
  419.         moveq   #-1,d0          ; Returncode ist negativ
  420.         movem.l (sp)+,d1-d7/a0-a6   ; Register wieder zurück
  421.         rts                     ; und vorzeitiger Abbruch
  422.  
  423. ChipCopy1:
  424.         move.l  60(sp),d1       ; Size, ursprünglich: 4(sp), in d1
  425.         subq    #1,d1           ; um eins korrigieren
  426.         move.l  64(sp),a0       ; Source, ursprünglich: 8(sp), in a0
  427.         move.l  d0,a1           ; Destination in a1
  428.  
  429. Chipcopyloop:
  430.         move.b  (a0)+,(a1)+     ; kopieren und um eins erhöhen
  431.         dbra.s  d1,Chipcopyloop ; wenn noch nicht zuende, dann weitermachen
  432.  
  433.         movem.l (sp)+,d1-d7/a0-a6   ; Register wieder zurück
  434.                                     ; D0 enthält jetzt die ChipMemAdresse
  435. }
  436.  
  437. end;{ ChipCopy }
  438.